﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Data;

namespace FormGridPadrao
{
    public partial class frmFormGridPadrao : Form
    {
        public FormCadastroPadrao.FormCadastro f;
        public FormGridPadrao.frmFormGridPadrao f2;
        public TabPage tbpgAba;
        public SplitContainer spltcntnr;

        public TabControl tbcntrlAbasGrid;
        public Panel pnlPrincipal;
        public tipo modo_form;

        public string tabela;
        public List<String> campos = new List<string>();

        public string selectInner = "";

        public string cod_anexo;

        public enum tipo
        {
            Principal = 0,
            Anexo = 1
        }

        public enum opcao_coluna
        {
            Normal = 0,
            Check = 1
        }

        protected bool habInserir = true;
        protected bool habAlterar = true;
        protected bool habExcluir = true;

        public frmFormGridPadrao()
        {
            InitializeComponent();

        }

        private void dtgrdvwDados_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            //f.ShowDialog();

        }

        public void habilitaInserir(bool habilita)
        {
            habInserir = habilita;
            tlstrpbtnIncluir.Enabled = habilita;
        }

        public void habilitaAlterar(bool habilita)
        {
            habAlterar = habilita;
            tlstrpbtnAlterar.Enabled = habilita;
        }

        public void habilitaExcluir(bool habilita)
        {
            habExcluir = habilita;
            tlstrpbtnExcluir.Enabled = habilita;
        }

        public void addColuna(opcao_coluna opcao, string nomeColuna, string valor_falso, string valor_verdadeiro)
        {
            if (opcao == opcao_coluna.Normal)
            {
                DataGridViewTextBoxColumn coluna_normal = new DataGridViewTextBoxColumn();
                coluna_normal.HeaderText = nomeColuna;
                dtgrdvwDados.Columns.Add(coluna_normal);
            }
            else
            {
                DataGridViewCheckBoxColumn coluna_check = new DataGridViewCheckBoxColumn();
                coluna_check.HeaderText = nomeColuna;
                coluna_check.FalseValue = valor_falso;
                coluna_check.TrueValue = valor_verdadeiro;
                dtgrdvwDados.Columns.Add(coluna_check);
            }
        }

        public void updateGridValues()
        {

            foreach (DataGridViewColumn column in dtgrdvwDados.Columns)
            {
                if (column.HeaderText == "Ativo" || column.HeaderText == "Liberado para Compras" || column.HeaderText == "Liberado para Vendas" || column.HeaderText == "Controlado")
                {
                    foreach (DataGridViewRow row in dtgrdvwDados.Rows)
                    {
                        row.Cells[column.Index].Value = convertBin(row.Cells[column.Index].Value);
                    }
                }
                else if (column.HeaderText == "Operação")
                {
                    foreach (DataGridViewRow row in dtgrdvwDados.Rows)
                    {
                        row.Cells[column.Index].Value = convertOperacao(row.Cells[column.Index].Value);
                    }
                }
                else if (column.HeaderText == "Grupo Pai")
                {
                    foreach (DataGridViewRow row in dtgrdvwDados.Rows)
                    {
                        if (row.Cells[column.Index].Value.ToString() != "")
                        {
                            row.Cells[column.Index].Value = convertGupoPai(row.Cells[column.Index].Value);
                        }
                    }
                }
                else if (column.HeaderText == "Se Sábado/ Domingo")
                {
                    foreach (DataGridViewRow row in dtgrdvwDados.Rows)
                    {
                        if (row.Cells[column.Index].Value.ToString() != "")
                        {
                            row.Cells[column.Index].Value = convertSeSabadoDomingo(row.Cells[column.Index].Value);
                        }
                    }
                }
                else if (column.HeaderText == "Tipo")
                {
                    foreach (DataGridViewRow row in dtgrdvwDados.Rows)
                    {
                        row.Cells[column.Index].Value = convertTipo(row.Cells[column.Index].Value);
                    }
                }
                else if (column.HeaderText == "UF")
                {
                    foreach (DataGridViewRow row in dtgrdvwDados.Rows)
                    {
                        row.Cells[column.Index].Value = convertUF(row.Cells[column.Index].Value);
                    }
                }
                else if (column.HeaderText == "Situação")
                {
                    foreach (DataGridViewRow row in dtgrdvwDados.Rows)
                    {
                        row.Cells[column.Index].Value = convertPeriodo(row.Cells[column.Index].Value);
                    }
                }
                else if (column.HeaderText == "Data Início")
                {
                    foreach (DataGridViewRow row in dtgrdvwDados.Rows)
                    {
                        row.Cells[column.Index].Value = Convert.ToDateTime(row.Cells[column.Index].Value);
                    }
                }
                else if (column.HeaderText == "Data Término")
                {
                    foreach (DataGridViewRow row in dtgrdvwDados.Rows)
                    {
                        row.Cells[column.Index].Value = Convert.ToDateTime(row.Cells[column.Index].Value);
                    }
                }
                else if (column.HeaderText == "Comprador")
                {
                    foreach (DataGridViewRow row in dtgrdvwDados.Rows)
                    {
                        row.Cells[column.Index].Value = convertBin(row.Cells[column.Index].Value);
                    }
                }
                else if (column.HeaderText == "Trocar Senha 1º Acesso")
                {
                    foreach (DataGridViewRow row in dtgrdvwDados.Rows)
                    {
                        row.Cells[column.Index].Value = convertBin(row.Cells[column.Index].Value);
                    }
                }
            }
        }

        private object convertTipoGupo(object value)
        {
            return (value.ToString() == "0") ? "Analítico" : "Sintético";
        }

        private object convertGupoPai(object p)
        {
            DataTable dt = Conexao.getInstance.executeQuery(SqlCrud.getInstance.selectCampo(ConstTabelas.GRUPOMATERIAL, "Codigo", "Nome", p));
            return dt.Rows[0][0].ToString();
        }

        private object convertOperacao(object value)
        {
            if (value.ToString() == "0")
            {
                return "Entrada";
            }
            else if (value.ToString() == "1")
            {
                return "Saída";
            }
            else
            {
                return "Transferencia";
            }
        }

        private object convertSeSabadoDomingo(object value)
        {
            if (value.ToString() == "0")
            {
                return "Postergar para Segunda";
            }
            else if (value.ToString() == "1")
            {
                return "Antecipar para Sexta";
            }
            else
            {
                return "Ignorar";
            }
        }

        private object convertUF(object value)
        {
            if (value.ToString() == "0")
            {
                return "AC";
            }
            else if (value.ToString() == "1")
            {
                return "AL";
            }
            else if (value.ToString() == "2")
            {
                return "AM";
            }
            else if (value.ToString() == "3")
            {
                return "AP";
            }
            else if (value.ToString() == "4")
            {
                return "BA";
            }
            else if (value.ToString() == "5")
            {
                return "CE";
            }
            else if (value.ToString() == "6")
            {
                return "DF";
            }
            else if (value.ToString() == "7")
            {
                return "ES";
            }
            else if (value.ToString() == "8")
            {
                return "GO";
            }
            else if (value.ToString() == "9")
            {
                return "MA";
            }
            else if (value.ToString() == "10")
            {
                return "MG";
            }
            else if (value.ToString() == "11")
            {
                return "MS";
            }
            else if (value.ToString() == "12")
            {
                return "MT";
            }
            else if (value.ToString() == "13")
            {
                return "PA";
            }
            else if (value.ToString() == "14")
            {
                return "PB";
            }
            else if (value.ToString() == "15")
            {
                return "PE";
            }
            else if (value.ToString() == "16")
            {
                return "PI";
            }
            else if (value.ToString() == "17")
            {
                return "PR";
            }
            else if (value.ToString() == "18")
            {
                return "RJ";
            }
            else if (value.ToString() == "19")
            {
                return "RN";
            }
            else if (value.ToString() == "20")
            {
                return "RO";
            }
            else if (value.ToString() == "21")
            {
                return "RR";
            }
            else if (value.ToString() == "22")
            {
                return "RS";
            }
            else if (value.ToString() == "23")
            {
                return "SC";
            }
            else if (value.ToString() == "24")
            {
                return "SE";
            }
            else if (value.ToString() == "25")
            {
                return "SP";
            }
            else
            {
                return "TO";
            }
        }

        private object convertTipo(object value)
        {
            return (value.ToString() == "0") ? "Vista" : "Prazo";
        }

        private object convertPeriodo(object value)
        {
            return (value.ToString() == "0") ? "Fechado" : "Aberto";
        }

        private object convertBin(object value)
        {
            return (value.ToString() == "0") ? "Não" : "Sim";
        }

        public void addLinha(params object[] values)
        {
            dtgrdvwDados.Rows.Add(values);
        }

        private void dtgrdvwDados_Paint(object sender, PaintEventArgs e)
        {
            txtbxRegistros.Text = dtgrdvwDados.RowCount.ToString();
            ajustaBotoesMovimentacao();
        }

        private void fecharAba()
        {
            if (modo_form == tipo.Principal)
            {
                tbpgAba.Dispose();
            }
            else
            {
                spltcntnr.Panel2Collapsed = true;
            }
        }

        private void fecharAnexoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            fecharAba();
        }

        private void frmFormGridPadrao_FormClosing(object sender, FormClosingEventArgs e)
        {
            fecharAba();
        }

        private void frmFormGridPadrao_Load(object sender, EventArgs e)
        {

        }

        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            fecharAba();
        }

        private void fecharTodosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            tbcntrlAbasGrid.Controls.Clear();
        }

        public void addAnexo(string texto, Image imagem)
        {
            if (tlstrpspltBtnAnexos.DropDownItems.Count < 2)
            {
                tlstrpspltBtnAnexos.DropDownItems.Add("-", null);
            }
            tlstrpspltBtnAnexos.DropDownItems.Add(texto, imagem, Anexo);
        }

        private void dtgrdvwDados_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            tlstrpbtnAlterar_Click(sender, e);
        }

        private void tlstrpbtnGravar_Click(object sender, EventArgs e)
        {
        }

        public void Anexo(object sender, EventArgs e)
        {
            spltcntnr.Panel2Collapsed = !spltcntnr.Panel2Collapsed;
            f2.Show();
        }

        public void habilitaBotoes()
        {
            tlstrpbtnIncluir.Enabled = tlstrpbtnGravar.Enabled;
            tlstrpbtnAlterar.Enabled = tlstrpbtnGravar.Enabled;
            tlstrpbtnExcluir.Enabled = tlstrpbtnGravar.Enabled;
            tlstrpbtnPrimeiro.Enabled = tlstrpbtnGravar.Enabled;
            tlstrpbtnProximo.Enabled = tlstrpbtnGravar.Enabled;
            tlstrpbtnAnterior.Enabled = tlstrpbtnGravar.Enabled;
            tlstrpbtnUltimo.Enabled = tlstrpbtnGravar.Enabled;
            tlstrpspltBtnAnexos.Enabled = tlstrpbtnGravar.Enabled;

            tlstrpbtnGravar.Enabled = !tlstrpbtnIncluir.Enabled;
            tlstrpbtnCancelar.Enabled = !tlstrpbtnIncluir.Enabled;

        }

        private void tlstrpbtnIncluir_Click(object sender, EventArgs e)
        {
            f.insert = true;
            f.clearFields();
            if (!f.campos[0].Autoinc)
            {
                Control[] c = f.tabPage1.Controls.Find(f.campos[0].ComponenteCampo, true);
                c[0].Enabled = true;
            }
            if (modo_form == tipo.Anexo)
            {
                Control[] c = f.tabPage1.Controls.Find(f.campos[0].ComponenteCampo, true);
                if (c[0] is TextBox)
                {
                    c[0].Text = cod_anexo;
                    c[0].Enabled = false;
                }
                if (c[0] is ComboBox)
                {
                    ComboBox combo = (ComboBox)(c[0]);
                    combo.SelectedValue = cod_anexo;
                    combo.Enabled = false;
                    c[0] = combo;
                }
            }
            f.Shown += f.setarAlterarSalvar;
            this.f.ShowDialog();
        }

        private void tlstrpbtnAlterar_Click(object sender, EventArgs e)
        {
            f.insert = false;
            f.clearFields();
            if (dtgrdvwDados.RowCount > 0)
            {
                if (cod_anexo == null)
                {
                    f.findRow(dtgrdvwDados.CurrentRow.Cells[0].Value.ToString());
                }
                else
                {
                    f.findRowComposto(dtgrdvwDados.CurrentRow.Cells[0].Value.ToString(),
                        dtgrdvwDados.CurrentRow.Cells[1].Value.ToString());
                }
                f.ajustaBotoesMovimentacao();
                f.Shown += f.setarAlterarSalvar;
                if (sender == tlstrpbtnAlterar)
                {
                    f.tlstrpbtnAlterar_Click(sender, e);
                }
                f.ShowDialog();
            }
        }

        private void tlstrpbtnExcluir_Click(object sender, EventArgs e)
        {
            //habilitaBotoes();
            if (MessageBox.Show(("Deseja realmente excluir este registro?"), "Excluir", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                delete();
            }
        }

        private void delete()
        {
            string sql = "";
            if (cod_anexo == null)
            {
                sql = SqlCrud.getInstance.deleteById(this.tabela, f.campos[0].Campo, dtgrdvwDados.CurrentRow.Cells[0].Value);
            }
            else
            {
                sql = SqlCrud.getInstance.deleteByIdComposto(this.tabela, f.campos[0].Campo,
                    dtgrdvwDados.CurrentRow.Cells[0].Value, f.campos[1].Campo, dtgrdvwDados.CurrentRow.Cells[1].Value);
            }
            try
            {
                Conexao.getInstance.execute(sql);

                int indice = dtgrdvwDados.CurrentRow.Index;
                carregaGrid();

                if (dtgrdvwDados.RowCount > 0)
                {
                    if (indice < dtgrdvwDados.RowCount)
                    {
                        if (cod_anexo == null)
                        {
                            dtgrdvwDados.CurrentCell = dtgrdvwDados[0, indice];
                        }
                        else
                        {
                            dtgrdvwDados.CurrentCell = dtgrdvwDados[1, indice];
                        }
                    }
                    else
                    {
                        if (cod_anexo == null)
                        {
                            dtgrdvwDados.CurrentCell = dtgrdvwDados[0, indice - 1];
                        }
                        else
                        {
                            dtgrdvwDados.CurrentCell = dtgrdvwDados[1, indice - 1];
                        }
                    }
                }
                //MessageBox.Show(f.Text + " excluido com sucesso!", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information);
                //habilitaBotoes();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Não foi possível excluir o registro! \n\nERRO: " + ex.Message + "\n\nSQL: " + sql, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        private void tlstrpbtnCancelar_Click(object sender, EventArgs e)
        {
            //habilitaBotoes();
        }

        public void tlstrpbtnPrimeiro_Click(object sender, EventArgs e)
        {
            if (dtgrdvwDados.RowCount > 0)
            {
                if (cod_anexo == null)
                {
                    dtgrdvwDados.CurrentCell = dtgrdvwDados[0, 0];
                }
                else
                {
                    dtgrdvwDados.CurrentCell = dtgrdvwDados[1, 0];
                }

            }
            ajustaBotoesMovimentacao();
        }

        public void tlstrpbtnUltimo_Click(object sender, EventArgs e)
        {
            if (dtgrdvwDados.RowCount > 0)
            {
                if (cod_anexo == null)
                {
                    dtgrdvwDados.CurrentCell = dtgrdvwDados[0, dtgrdvwDados.RowCount - 1];
                }
                else
                {
                    dtgrdvwDados.CurrentCell = dtgrdvwDados[1, dtgrdvwDados.RowCount - 1];
                }
            }
            ajustaBotoesMovimentacao();
        }

        public void tlstrpbtnAnterior_Click(object sender, EventArgs e)
        {
            if (dtgrdvwDados.RowCount > 0)
            {
                int index = dtgrdvwDados.CurrentCell.RowIndex - 1;
                if (index >= 0)
                {
                    if (cod_anexo == null)
                    {
                        dtgrdvwDados.CurrentCell = dtgrdvwDados[0, index];
                    }
                    else
                    {
                        dtgrdvwDados.CurrentCell = dtgrdvwDados[1, index];
                    }
                }
                ajustaBotoesMovimentacao();
            }
        }

        public void tlstrpbtnProximo_Click(object sender, EventArgs e)
        {
            if (dtgrdvwDados.RowCount > 0)
            {
                int index = dtgrdvwDados.CurrentCell.RowIndex + 1;
                if (index < dtgrdvwDados.RowCount)
                {
                    if (cod_anexo == null)
                    {
                        dtgrdvwDados.CurrentCell = dtgrdvwDados[0, index];
                    }
                    else
                    {
                        dtgrdvwDados.CurrentCell = dtgrdvwDados[1, index];
                    }
                }
                ajustaBotoesMovimentacao();
            }
        }

        private void ajustaBotoesMovimentacao()
        {
            if (dtgrdvwDados.RowCount > 1)
            {
                tlstrpbtnPrimeiro.Enabled = true;
                tlstrpbtnAnterior.Enabled = true;
                tlstrpbtnProximo.Enabled = true;
                tlstrpbtnUltimo.Enabled = true;

                if (dtgrdvwDados.CurrentCell.RowIndex == 0)
                {
                    tlstrpbtnPrimeiro.Enabled = false;
                    tlstrpbtnAnterior.Enabled = false;
                }
                else if (dtgrdvwDados.CurrentCell.RowIndex == dtgrdvwDados.RowCount - 1)
                {
                    tlstrpbtnProximo.Enabled = false;
                    tlstrpbtnUltimo.Enabled = false;
                }
            }
            else
            {
                tlstrpbtnPrimeiro.Enabled = false;
                tlstrpbtnAnterior.Enabled = false;
                tlstrpbtnProximo.Enabled = false;
                tlstrpbtnUltimo.Enabled = false;
            }
        }

        private void dtgrdvwDados_KeyPress(object sender, KeyPressEventArgs e)
        {

        }

        public void carregaGrid()
        {
            if (selectInner == "")
            {
                dtgrdvwDados.DataSource = Data.Conexao.getInstance.executeQuery(getSelectPog());
                renameColumns();
                updateGridValues();
            }
            else
            {
                if (cod_anexo == null)
                {
                    dtgrdvwDados.DataSource = Data.Conexao.getInstance.executeQuery(selectInner);
                }
                else
                {
                    dtgrdvwDados.DataSource = Data.Conexao.getInstance.executeQuery(selectInner + " and " + f.campos[0].Campo + " = '" + cod_anexo + "'");
                }

                renameColumns();
            }

            f.grid = this;
            if (dtgrdvwDados.RowCount == 0)
            {
                tlstrpbtnAlterar.Enabled = false;
                tlstrpbtnExcluir.Enabled = false;
            }
            else
            {
                if (habAlterar)
                {
                    tlstrpbtnAlterar.Enabled = true;
                }
                if (habExcluir)
                {
                    tlstrpbtnExcluir.Enabled = true;
                }
            }

        }

        private void renameColumns()
        {
            int i = 0;
            foreach (Dados d in f.campos)
            {
                dtgrdvwDados.Columns[i].HeaderText = d.Label;
                i++;
            }
        }

        private string getSelectPog()
        {
            campos = new List<string>();

            foreach (Dados d in f.campos)
            {
                campos.Add("Convert(varchar, " + d.Campo + ")");
            }
            if (modo_form == tipo.Principal)
            {
                return SqlCrud.getInstance.select(tabela, campos);
            }
            else
            {
                return SqlCrud.getInstance.select(tabela, campos, f.campos[0].Campo + " = '" + cod_anexo + "'");
            }
        }

        private void tlstrpbtnRefresh_Click(object sender, EventArgs e)
        {
            carregaGrid();
        }

        private void dtgrdvwDados_SelectionChanged(object sender, EventArgs e)
        {
            if (f2 != null)
            {
                if (dtgrdvwDados.RowCount > 0)
                {
                    f2.atualizaGridAnexo(dtgrdvwDados.CurrentRow.Cells[0].Value.ToString());
                }
            }
        }

        public void atualizaGridAnexo(string texto)
        {
            cod_anexo = texto;
            if (f != null)
            {
                f.cod_anexo = this.cod_anexo;
            }
            carregaGrid();
        }

        private void frmFormGridPadrao_KeyDown(object sender, KeyEventArgs e)
        {
            
        }

        private void frmFormGridPadrao_Shown(object sender, EventArgs e)
        {
        }

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            //if (keyData == (Keys.Control | Keys.F))
            if (keyData == (Keys.F5))
            {
                if (tlstrpbtnIncluir.Enabled)
                {
                    tlstrpbtnIncluir_Click(null, null);
                }
                return true;
            }
            else if (keyData == Keys.F6)
            {
                if (tlstrpbtnAlterar.Enabled)
                {
                    tlstrpbtnAlterar_Click(null, null);
                }
            }
            else if (keyData == Keys.F7)
            {
                if (tlstrpbtnExcluir.Enabled)
                {
                    tlstrpbtnExcluir_Click(null, null);
                }
            }
            else if (keyData == (Keys.Control | Keys.R))
            {
                if (tlstrpbtnRefresh.Enabled)
                {
                    tlstrpbtnRefresh_Click(null, null);
                }
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }
    }
}
